parser grammar XMLParser;

options {
  language = Java;
  tokenVocab = XMLLexer;
  backtrack = true;
  ASTLabelType = MiArbol;
  output = AST;
}

@header {
  package practpl.diez;
}


@members {
     
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
     
     boolean abierta = false;
 
}

biblioteca
: elementos
;

elementos
: abre_etiqueta^
    
  (elementos|IDENT+)+
     
  cierra_etiqueta! 
;

abre_etiqueta
: AETIQUETA! IDENT^ CETIQUETA!
;

cierra_etiqueta
: AETIQUETACIERRE! IDENT^ CETIQUETA!
;